package optimizacion;

import java.util.Random;

import auxiliares.FuncionesAuxiliares;

/**
 * Clase que extiende de la clase padre Gen con genotipo Boolean (0,1) y fenotipo double
 * Calulamos su longitud mediante una funcion de FuncionesAuxiliares
 */
public class GenBinario{
	
	 protected int[] genotipo;
	 public double fenotipo;    
	 protected int longitud;
	
	public GenBinario(double min, double max, double tolerancia){
        this.longitud = FuncionesAuxiliares.calcularLongitudGen(min, max, tolerancia);
        this.genotipo = new int[longitud];
	}
	
	public GenBinario(){
	}

	public Double calcularFenotipo(double min, double max) {		
		int valorDec = FuncionesAuxiliares.binToDec(genotipo);
		this.fenotipo = (double) (min + (max - min) * valorDec / (Math.pow(2, longitud) - 1));
	    return fenotipo;
	}
	
    public void inicializar(int valorSemilla, boolean semilla){
    	Random r;
    	
    	if (semilla) r= new Random(valorSemilla);
    	else  r= new Random();
    	
        for (int i=0; i<longitud; i++) 
        	genotipo[i] = r.nextInt(2);         
    }
    
    public GenBinario clone (){
    	GenBinario gen = new GenBinario();
    	gen.genotipo = this.genotipo.clone();
    	gen.fenotipo = this.fenotipo;
    	gen.longitud = this.longitud;
    	return gen;    		
    }
    
    public void mutar(int i){
    	if (genotipo[i] == 1) genotipo[i] = 0;
    	else genotipo[i] = 1;
    }
    
//    public ArrayList<Integer> genotipoToArrayList() {
//    	ArrayList<Integer> al = new ArrayList<Integer>();
//    	
//    	for (int i = 0; i < longitud; i++)
//    		al.add(genotipo[i]);
//    	
//		return al;
//	}
    
	public int[] getGenotipo() {
		return genotipo;
	}

	public void setGenotipo(int[] genotipo) {
		this.genotipo = genotipo;
	}

	public double getFenotipo() {
		return fenotipo;
	}

	public void setFenotipo(double fenotipo) {
		this.fenotipo = fenotipo;
	}

	public int getLongitud() {
		return longitud;
	}

	public void setLongitud(int longitud) {
		this.longitud = longitud;
	}


    
    
}